<html>
<title>MARS Release History and Notes
</title>
<body>
<center>
<h3>MARS - Mips Assembly and Runtime Simulator</h3>
<h4>Release 4.1</h4>
<h4>January 2011</h4>
<h4>MARS Release History</h4>
</center>

 
<p>Mars 4.1 was released in January 2011.  Enhancements and bug fixes include:
<ul>

<li>The ability to view Data Segment contents interpreted as ASCII
characters has been added.  You'll find it on the bottom border of
the Data Segment Window as the checkbox "ASCII".  This overrides the
hexadecimal/decimal setting but only for the Data Segment display.
It does not persist across sessions.  Cells cannot be edited in
ASCII format.
</li>

<li>The Dump Memory feature in the File menu now provides an ASCII dump
format.  Memory contents are interpreted as ASCII codes.
</li>

<li>A command-mode option "ascii" has been added to display memory or
register contents interpreted as ASCII codes.  It joins the existing
"dec" and "hex" options for displaying in decimal or hexadecimal,
respectively.  Only one of the three may be specified.
</li>

<li>The actual characters to display for all the ASCII display options
(data segment window, dump memory, command-mode option) are
specified in the config.properties file.  This includes a "placeholder"
character to be displayed for all codes specified as non-printing.
ASCII codes 1-7, 14-31, and 127-255 are specified as 
non-printing, but this can be changed in the properties file.
</li>

<li>A new Help tab called Exceptions has been added.  It explains the basics
of MIPS exceptions and interrupts as implemented in MARS.  It also includes
tips for writing and using exception handlers.
</li>

<li>A new Tool called Bitmap Display has been added.  You can use it
to simulate a simple bitmap display.  Each word of the specified address
space represents a 24 bit RGB color (red in bits 16-23, green in bits
8-15, blue in bits 0-7) and a word's value will be displayed on the Tool's 
display area when the word is written to by the MIPS program.  The base
address corresponds to the upper left corner of the display, and words are
displayed in row-major order.  Version 1.0 is pretty basic, constructed
from the Memory Reference Visualization Tool code.
</li> 

<li>Additional operand formats
were added for the multiplication pseudo-instructions 'mul' and 'mulu'.
</li>

<li>The editor's context-sensitive pop-up help will now appear below
the current line whenever possible.  Originally it appeared either above, 
centered to the side,
or below, depending on the current line's vertical position in the editing
window.  Displaying the pop-up above the current line tended to visually block
important information, since frequently a line of code uses the same operand 
(especially registers) as the one immediately above it.
</li>

<li>The editor will now auto-indent each new line when the Enter
key is pressed.  Indentation of the new line will match that of the
line that precedes it.  This feature can be disabled in the Editor settings dialog.
</li>

<li>Two new command-mode options have been added.  The "aeN" option, where
N is an integer, will terminate MARS with exit value N when an assemble error 
occurs.  The "seN" option will similarly terminate MARS with exit value
N when a simulation (MIPS runtime) error occurs.  These options can be useful
when writing scripts for grading. Thanks to my Software
Engineering students Robert Anderson, Jonathan Barnes, Sean Pomeroy, and Melissa Tress
for designing and implementing these options.
</li>

<li>An editor bug that affected Macintosh users has been fixed.  
Command shortcuts, e.g. Command-s for save, did not 
function and also inserted the character into the text. 
</li>

<li>A bug in Syscall 54 (InputDialogString) has been fixed.  This syscall is
the GUI equivalent of Syscall 8 (ReadString), which follows the semantics
of UNIX 'fgets'.  Syscall 54 has been modified to also follow the 'fgets'
semantics.
</li>

<li>A bug in the Cache Simulator Tool has been fixed.  The animator that
paints visualized blocks green or red (to show cache hit or miss) sometimes
paints the wrong block when set-associated caching is used.  The underlying
caching algorithm is correct so the numeric results such as hit ratios
have always been correct.  The animator has been corrected.
Thanks to Andreas Schafer and his student Carsten Demel for bringing this
to my attention.
</li>

</ul>

<p>Mars 4.0.1 was released in October 2010.  It is a bug fix release to address three bugs.
<ul>
<li>The Edit and Execute tabs of the IDE, which were relocated in 4.0 from the top to the left edge and oriented vertically, have been
moved back to the top edge because Macintosh running Java 1.6 does not correctly render vertically-oriented tabs.
</li>
<li>An exception may be thrown in multi-file assembles when the last file of the assembly is not the longest. This occurs
only when using the IDE, and has been corrected.
</li>
<li>If an assemble operation fails due to a non-existing exception handler file (specified through the IDE Settings menu), unchecking
the exception handler setting does not prevent the same error from occuring on the next assemble. This has been corrected.
</li>
</ul>
 
<p>Mars 4.0 was released in August 2010.  Enhancements and bug fixes include:
<ul>

<li><i>New Text Editor:</i> Mars features an entirely new integrated text editor.  Multiple files can be open
simulataneously, each in its own tab.  The editor now features language-aware 
color highlighting of many MIPS assembly language elements with customizable 
colors and styles.  It also features automatic context-sensitive popup instruction 
guides.  There are two levels: one with help and autocompletion of instruction names
and a second with help information for operands.  These and other new editor 
features can be customized or disabled through
the expanded Editor Settings dialog.  You can even revert to the previous 
notepad-style editor if you wish (multi-file capability is retained).  
The language-aware editor is based on
the open source <i>jEdit Syntax Package</i> (syntax.jedit.org).  It is separate from
the assembler, so any syntax highlighting quirks will not affect assembly.
</li>

<li><i>Improved Instruction Help:</i> All the instruction examples in the help tabs (and new popup instruction guides)
now use realistic register names, e.g. $t1, $t2, instead of $1, $2.  The instruction format
key displayed above the MIPS help tabs has been expanded to include explanations of the 
various addressing modes for load and store instructions and pseudo-instructions.  
Descriptions have been added to every example instruction and pseudo-instruction.
</li>

<li><i>Improved Assembly Error Capability:</i> If the assemble operation results in errors, the first error message
in the Mars Messages text area will be highighted and the corresponding erroneous instruction will be selected in the
text editor.  In addition, you can click on any error message in the Mars Messages text area to select the corresponding
erroneous instruction in the text editor.  The first feature does not select in every situation (such as when
assemble-on-open is set) but in the situations where it doesn't work no harm is done plus
the second feature, clicking on error messages, can still be used.
</li>

<li>Console input syscalls (5, 6, 7, 8, 12) executed in the IDE now receive input keystrokes directly in the Run I/O text 
area instead of through a popup input dialog.  Thanks to Ricardo Pascual for providing this feature!
If you prefer the popup dialogs, there is a setting to restore them.
</li>

<li>The floor, ceil, trunc and round operations now all produce the MIPS default result 2^31-1 if the value is 
infinity, NaN or out of 32-bit range.  For consistency, the sqrt operations now produce the result NaN if the operand is negative
(instead of raising an exception).  These cases are all consistent with FCSR (FPU Control and Status Register)
Invalid Operation flag being off.  The ideal solution would be to simulate the FCSR register itself so all 
MIPS specs for floating point instructions can be implemented, but that hasn't happened yet.
</li>

<li>The Basic column in the Text Segment Window now displays data and addresses in either decimal or
hexadecimal, depending on the current settings.  Note that the "address" in branch instructions 
is actually an offset relative to the PC, so is treated as data not address.  Since data operands in
basic instructions are no more than 16 bits long, their hexadecimal display includes only 4 digits.
</li>

<li>The Source column in the Text Segment Window now preserves tab spacing for a cleaner appearance (tab characters were previously not rendered).
</li>

<li>Instruction mnemonics can now be used as labels, e.g. "<tt>b:</tt>".
</li>

<li>New syscall 36 will display an integer as an unsigned decimal.
</li>

<li>A new tool, Digital Lab Sim, contributed by Didier Teifreto (dteifreto@lifc.univ-fcomte.fr).  This tool
features two seven-segment displays, a hexadecimal keypad, and a counter.  It uses MMIO to explore 
interrupt-driven I/O in an engaging setting.  More information is available from its Help feature.  Many thanks!
</li>

<li>MARS 4.0 requires Java 1.5 (5.0) instead of 1.4.  If this is an issue for you, let me know.
</li>



</ul>




<p>Mars 3.8 was released in January 2010.  Enhancements and bug fixes include:
<ul>

<li>A new feature to temporarily suspend breakpoints you have previously set.  Use it
when you feel confident enough to run your program without the breakpoints but not
confident enough to clear them!  Use the Toggle Breakpoints item in the Run menu, or
simply click on the "Bkpt" column header in the Text Segment window.  Repeat, to re-activate.
</li>

<li>Two new Tools contributed by Ingo Kofler of Klagenfurt University in Austria.
One generates instruction statistics and the other simulates branch prediction using
a Branch History Table.
</li>

<li>Two new print syscalls.  Syscall 34 prints an integer in hexadecimal format.
Syscall 35 prints an integer in binary format.  Suggested by Bernardo Cunha of Portugal.
</li>

<li>A new Setting to control whether or not the MIPS program counter will be
initialized to the statement with global label 'main' if such a statement exists.  If 
the setting is unchecked or if checked and there is no 'main', the program counter 
will be initialized to the default starting address.  Release 3.7 was programmed
to automatically initialize it to the statement labeled 'main'.  This led to 
problems with programs that use the standard SPIM exception handler exceptions.s
because it includes a short statement sequence at the default starting address
to do some initialization then branch to 'main'.  Under 3.7 the initialization 
sequence was being bypassed.  By default this setting is unchecked.  This
option can be specified in command mode using the 'sm' (Start at Main) option.
</li>

<li>Mars Tools that exist outside of Mars can now be included in the Tools
menu by placing them in a JAR and including it in a command that launches
the Mars IDE.  For example: <tt>java -cp plugin.jar;Mars.jar Mars</tt>
Thanks to Ingo Kofler for thinking of this technique and providing the
patch to implement it.
</li>

<li>Corrections and general improvements to the MIDI syscalls.  Thanks to Max Hailperin
of Gustavus Adolphus College for supplying them.
</li>

<li>Correction to an assembler bug that flagged misidentified invalid MIPS instructions 
as directives.
</li>

</ul>


<p>Mars 3.7 was released in August 2009.  Enhancements and bug fixes include:
<ul>

<li>A new feature for changing the address space configuration of the
simulated MIPS machine.  The 32-bit address space configuration used by
all previous releases remains the default.  We have defined two
alternative configurations for a compact 32KB address space.  One starts the
text segment at address 0 and the other starts the data segment at address 0.
A 32KB address space permits commonly-used load/store pseudo-instructions 
using labels, such as <tt>lw  $t0,increment</tt>, to expand to a single basic
instruction since the label's full address will fit into the 16-bit address
offset field without sign-extending to a negative value.  This was done in response to
several requests over the years for smaller addresses and simplified expansions 
to make assembly programs easier to comprehend.  This release does not 
include the ability to define your own customized configuration, although we
anticipate adding it in the future.  It is available both through the command
mode (option mc) and the IDE.
See <tt>Memory Configuration...</tt> at the bottom of the Settings menu.</li>

<li>Related to the previous item: load and store pseudo-instructions of the form
<tt>lw $t0,label</tt> and <tt>lw $t0,label($t1)</tt> will expand to a single
instruction (<tt>addi</tt> for these examples) if the current memory configuration assures the
label's full address will fit into the low-order 15 bits.  Instructions
for which this was implemented are: la, lw, lh, lb, lhu, lbu, lwl, lwr, ll,
lwc1, ldc1, l.s, l.d, sw, sh, sb, swl, swr, sc, swc1, sdc1,
s.s, and s.d.</li>

<li>If a file contains a global statement label "main" (without quotes, case-sensitive), then execution will
begin at that statement regardless of its address.  Previously, program execution
always started at the base address of the text segment.  This will be handy for
multi-file projects because you no longer need to have the "main file" opened in
the editor in order to run the project.  Note that main has to be declared global
using the <tt>.globl</tt> directive.</li>

<li>We have added a Find/Replace feature to the editor.  This has been another
frequent request.  Access it through the Edit menu or Ctrl-F.  Look for major
enhancements to the editor in 2010!</li>

<li>The syscalls for Open File (13), Read from File (14), and Write to File (15)
all now place their return value into register $v0 instead of $a0.  The table
in <i>Computer Organization and Design</i>'s Appendix B on SPIM specifies
$a0 but SPIM itself consistently uses $v0 for the return values.</li>

<li>Pseudo-instructions for div, divu, mulo, mulou, rem, remu, seq, sne, sge, 
sgeu, sgt, sgtu, sle, sleu now accept a 16- or 32-bit immediate as their third operand.  
Previously the third operand had to be a register.</li>

<li>Existing Tools were tested using reconfigured memory address space (see first item).  Made some
adaptations to the Keyboard and Display Simulator Tool that allow it to be used for
Memory Mapped I/O (MMIO) even under the compact memory model, where the MMIO base address
is 0x00007f00 instead of 0xffff0000.  Highlighting is not perfect in this scenario.</li>

<li>Bug Fix:  The syscall for Open File (13) reversed the meanings of the
terms <i>mode</i> and <i>flag</i>.  Flags are used to indicate the intended
use of the file (read/write).  Mode is used to set file permissions in specific situations.
MARS implements selected flags as supported by Java file streams, 
and ignores the mode if specified.  For more details, see the Syscalls
tab under Help.  The file example in that tab has been corrected.</li>

<li>Bug Fix: The assembler incorrectly generated an
error on Jump instructions located in the kernel text segment.</li>

<li>Bug Fix: The project (p) option in the command interface worked incorrectly
when MARS was invoked within the directory containing the files to be assembled.</li>

<li>Acknowledgement: The development of Release 3.7 was supported by a SIGCSE
Special Projects Grant.</li>

</ul>



<p>Mars 3.6 was released in January 2009.  Enhancements and bug fixes include:
<ul>

<li>We've finally implemented the most requested new feature: memory and register cells will
be highlighted when written to during timed or stepped simulation!  The 
highlighted memory/register cell thus represents the result of the instruction just completed.
During timed or stepped execution, this is NOT the highlighted instruction.  During back-stepping,
this IS the highlighted instruction.  The highlighted instruction is the next one
to be executed in the normal (forward) execution sequence.

<li>In conjunction with cell highlighting, we've added the ability to customize the highlighting
color scheme and font.  Select Highlighting in the Settings menu.  In the resulting dialog,
you can select highlight background color, text color, and font for the different runtime tables (Text segment,
Data segment, Registers).  You can also select them for normal, not just
highlighted, display by even- and odd-numbered row but not by table.

<li>Cool new Labels Window feature: the table can be sorted in either ascending or descending
order based on either the Label (alphanumeric) or the Address (numeric) column.  Just click on
the column heading to select and toggle between ascending (upright triangle) or descending
(inverted triangle).  Addresses are sorted based on unsigned 32 bit values. 
The setting persists across sessions.</li>

<li>The Messages panel, which includes the Mars Messages and Run I/O tabs, now displays using
a mono-spaced (fixed character width) font.  This facilitates text-based graphics when running
from the IDE.</li>

<li>The Mars.jar distribution file now contains all files needed to produce
a new jar file.  This will make it easier for you to expand the jar, modify source files,
recompile and produce a new jar for local use.  <tt>CreatMarsJar.bat</tt> contains the jar instruction.</li>

<li>The Help window now includes a tab for Acknowledgements.  This recognizes MARS contributors
and correspondents.</li>

<li>We've added a new system call (syscall) for generating MIDI tones synchronously, syscall 33.
The original MIDI call returns immediately when the tone is generated.  The new one will not return
until the tone output is complete regardless of its duration.

<li>The Data Segment display now scrolls 8 rows (half a table) rather than 16 when the 
arrow buttons are clicked.  This makes it easier to view a sequence of related cells that
happen to cross a table boundary.  Note you can hold down either button for rapid scrolling.
The combo box with various data address boundaries also works better now.</li>

<li>Bug Fix: Two corrections to the Keyboard and Display Simulator Tool.  Transmitter Ready bit was 
not being reset based on instruction count
when running in the kernel text segment, and the Status register's Exception Level bit was not
tested before enabling the interrupt service routine (could lead to looping if interrupts occur
w/i the interrupt service routine).  Thanks to Michael Clancy and Carl Hauser for bringing these
to my attention and suggesting solutions.</li>

<li>Bug Fix: Stack segment byte addresses not on word boundaries were not being processed
correctly.  This applies to little-endian byte order (big-endian is not enabled or tested in MARS).
Thanks to Saul Spatz for recognizing the problem and providing a patch.</li>

<li>Minor Bug Fixes include: Correcting a fault leading to failure when launching MARS in command 
mode, clarifying assembler error message for too-few or too-many operands error, and correcting the
description of lhu and lbu instructions from "unaligned" to "unsigned".</li>


</ul>



<p>Mars 3.5 was released in August 2008.  Major enhancements and bug fixes include:
<ul>

<li>A new Tool, the Keyboard and Display MMIO Simulator, that supports polled and interrupt-driven
input and output operations through Memory-Mapped I/O (MMIO) memory.  The MIPS program writes to
memory locations which serve as registers for simulated devices.  Supports keyboard input and a
simulated character-oriented display.  Click the tool's Help button for more details.</li>

<li>A new Tool, the Instruction Counter, contributed by MARS user Felipe Lessa.  It will count the
number of MIPS instructions executed along with percentages for R-format, I-format, and J-format
instructions. Thanks, Felipe!</li>

<li>Program arguments can now be provided to the MIPS program at runtime, through either an IDE setting or
command mode.  See the command mode "pa" option for more details on command mode operation.  The argument
count (argc) is placed in $a0 and the address of an array of null-terminated strings containing the
arguments (argv) is placed in $a1.  They are also available on the runtime stack ($sp). </li>

<li>Two related changes permit MARS to assemble source code produced by certain compilers such as gcc.
One change is to issue warnings rather than errors for unrecognized directives.  MARS implements a
limited number of directives.  Ignore these warnings at your risk, but the assembly can continue.
The second change is to allow statement labels to contain, and specifically begin with, '$'.</li>

<li>In command mode, final register values are displayed by giving the register name as an option.
Register names begin with '$', which is intercepted by certain OS command shells.  The
convention for escaping it is not uniform across shells.  We have enhanced the options so now you can
give the register name without the '$'.  For instance, you can use t0 instead of $t0 as the option.
You cannot refer to registers by number in this manner, since an integer option is interpreted by
the command parser as an instruction execution limit.  Thanks to Lucien Chaubert for reporting
this problem.</li>

<li>Minor enhancements: The command mode dump feature has been extended to permit memory address ranges as well
as segment names. If you enter a new file extension into the Open dialog, the extension will remain available throughout
the interactive session. The data segment value repetition operator ':' now 
works for all numeric directives (.word, .half, .byte, .float, .double).
This allows you to initialize multiple consecutive memory locations to the same value.  For
example: <br><tt>ones: .half 1 : 8  # Store the value 1 in 8 consecutive halfwords</tt></li>

<li>Major change:  Hexadecimal constants containing less than 8 digits will be interpreted as though the
leading digits are 0's.  For instance, 0xFFFF will be interpreted as 0x0000FFFF, not 0xFFFFFFFF as before.
This was causing problems with immediate operands in the range 32768 through 65535, which were 
misinterpreted by the logical operations as signed 32 bit values rather than unsigned 16 bit values.
Signed and unsigned 16 bit values are now distinguished by the tokenizer based on the prototype
symbols -100 for signed and 100 for unsigned (mainly logical operations).
Many thanks to Eric Shade of Missouri State University and Greg Gibeling of UC Berkeley for 
their extended efforts in helping me address this situation.</li>

<li>Minor Bug Fixes: <tt>round.w.s</tt> and <tt>round.w.d</tt> have been modified to correctly perform IEEE
rounding by default.  Thanks to Eric Shade for pointing this out. 
Syscall 12 (read character) has been changed to leave the character in $v0 rather then $a0.  The
original was based on a misprint in Appendix A of <i>Computer Organization and Design</i>.
MARS would not execute from the executable Mars.jar file if it was stored in a directory
path those directory names contain any non-ASCII characters.  This has been corrected.  Thanks to
Felipe Lessa for pointing this out and offering a solution.
MARS will now correctly detect the EOF condition when reading from a file using syscall 14.
Thanks to David Reimann for bringing this to our attention.
</ul>



<p>Mars 3.4.1 was released on 23 January 2008.  It is a bug fix release to address two bugs.
<ul>
<li>One bug shows up in pseudo-instructions in which the expansion includes branch instructions.  The fixed branch
offsets were no longer correct due to changes in the calculation of branch offsets in Release 3.4.
At the same time, we addressed the issue of expanding such pseudo-instructions when 
delayed branching is enabled.  Such expansions will now include a nop instruction following the
branch.  
<li>We also addressed an off-by-one error that occurred in generating the lui instruction in the
expansion of conditional branch pseudo-instructions whose second operand is a 32 bit immediate.
<li>The expansions for a number of pseudo-instructions were modified to eliminate internal branches.
These and other expansions were also optimized for sign-extended loading of 16-bit immediate operands
by replacing the lui/ori or lui/sra sequence with addi.  Pseudo-instructions affected by one
or both of these modifications include: abs, bleu, bgtu, beq, bne, seq, sge, sgeu, sle, sleu, sne,
li, sub and subi.  These modifications were suggested by Eric Shade of Missouri State University.
</ul>

<p>Mars 3.4 was released in January 2008.  Major enhancements are:
<ul>

<li>A new syscall (32) to support pauses of specified length in milliseconds (sleep) during simulated execution.

<li>Five new syscalls (40-44) to support the use of pseudo-random number generators.  An unlimited number of these generators are available,
each identified by an integer value, and for each you have the ability to: set the seed value, generate a 32 bit integer value from the Java
int range, generate a 32 bit integer value between 0 (inclusive) and a specified upper bound (exclusive), generate a 32-bit float value between 0 (inclusive) and 1 (exclusive),
and generate a 64-bit double value between 0 (inclusive) and 1 (exclusive).  All are based on the <tt>java.util.Random</tt> class.

<li>Ten new syscalls (50-59) to support message dialog windows and data input dialog windows.  The latter are distinguished from
the standard data input syscalls in that a prompting message is specified as a syscall argument and displayed in the input dialog. 
All are based on the <tt>javax.swing.JOptionPane</tt> class.

<li>The capability to dump <tt>.text</tt> or <tt>.data</tt> memory contents to file in various formats.  The dump can be performed
before or after program execution from either the IDE (File menu and toolbar) or from command mode.  It can also be performed
during an execution pause from the IDE.  Look for the "Dump Memory" menu item in the File menu, or the "dump" option in command
mode.  A <tt>.text</tt> dump will include only locations containing an instruction.  A <tt>.data</tt> dump will include a multiple
of 4KB "pages" starting at the segment base address and ending with the last 4KB "page" to be referenced by the
program.  Current dump formats include pure binary (<tt>java.io.PrintStream.write()</tt> method), hexadecimal text with one word (32 bits) 
per line, and binary text with one word per line.  An interface, abstract class, and format loader have been developed to facilitate 
development and deployment of additional dump formats.  This capability was prototyped by Greg Gibeling of UC Berkeley.

<li>Changed the calculation of branch offsets when Delayed Branching setting is disabled.  
Branch instruction target addresses are represented by
the relative number of words to branch.  With Release 3.4, this value reflects delayed branching,
regardless of whether the Delayed Branching setting is enabled or not.  
The generated binary code for branches will now match that of examples in the <em>Computer Organization
and Design</em> textbook.  This is a change from the past, and was made after extensive discussions 
with several MARS adopters.  Previously, the branch offset was 1 lower if the Delayed Branching setting
was enabled -- the instruction <tt>label: beq $0,$0,label</tt> would generate <tt>0x1000FFFF</tt> if
Delayed Branching was enabled and <tt>0x10000000</tt> if it was disabled.  Now it will generate <tt>0x1000FFFF</tt> in
either case.  The simulator will always branch to the correct location; MARS does not allow assembly under one
setting and simulation under the other.

<li>Bug fix: The <tt>mars.jar</tt> executable JAR file can now be run from a different working directory.  Fix was
suggested by Zachary Kurmas of Grand Valley State University.

<li>Bug fix: The problem of MARS hanging while assembling a pseudo-instruction with a label operand that
contains the substring "lab", has been fixed.

<li>Bug fix: No Swing-related code will be executed when MARS is run in command mode.  This fixes a problem that
occurred when MARS was run on a "headless" system (no monitor).  Swing is the Java library to support
programming Graphical User Interfaces.  Fix was provided by Greg Gibeling of UC Berkeley.

<li>The '\0' character is now recognized when it appears in string literals.


</ul>

<p>MARS 3.3 was released in July 2007.  Major enhancements are:
<ul>
<li>Support for MIPS delayed branching.  All MIPS computers implement this but it can be confusing for
programmers, so it is disabled by default.  Under delayed branching, the next instruction after a branch 
or jump instruction will <i>always</i> be executed, even if the branch or jump is taken!  Many 
programmers and assemblers deal with this by inserting a do-nothing "nop" instruction after every branch or jump.
The MARS assembler does <i>not</i> insert a "nop".  Certain pseudo-instructions expand to
a sequence that includes a branch; such instructions will not work correctly under delayed
branching.
Delayed branching is available in command mode with the "db" option.</li>
<li>A new tool of interest mainly to instructors.  The Screen Magnifier tool, when selected from
the Tools menu, can be used to produce an enlarged static image of the pixels that lie beneath it.
The image can be annotated by dragging the mouse over it to produce a scribble line.  It enlarges
up to 4 times original size.</li>
<li>You now have the ability to set and modify the text editor font family, style and size.  Select
"Editor..." from the Settings menu to get the dialog. Click the Apply button to see the new
settings while the dialog is still open.  Font settings are retained from one session to the next.
The font family list begins with 6 fonts commonly used across platforms (selected from lists
found at <a href="http://www.codestyle.org">www.codestyle.org</a>), followed by a complete list.
Two of the six are monospaced fonts, two are proportional serif, and two are proportional sans serif.</li>
<li>The Labels window on the Execute pane, which displays symbol table information, has been
enhanced.  When you click on a label name or its address, the contents of that address are
centered and highlighted in the Text Segment window or Data Segment window as appropriate.  This makes
it easier to set breakpoints based on text labels, or to find the value stored at a label's address.
<li>If you re-order the columns in the Text Segment window by dragging a column header, 
the new ordering will be remembered and applied from that time forward, even from one MARS session to the next.  The Text Segment
window is where source code, basic code, binary code, code addresses, and breakpoints are displayed.
<li>If a MIPS program terminates by "running off the bottom" of the program, MARS terminates, as 
before, without an exception, but now will display a more descriptive termination message in the
Messages window.  Previously, the termination message was the same as that generated after executing an Exit syscall.
<li>A new system call (syscall) to obtain the system time is now available.  It is service
30 and is not available in SPIM.  Its value is obtained from the <tt>java.util.Date.getTime()</tt> method.  
See the Syscall tab in MIPS help for further information.  </li>
<li>A new system call (syscall) to produce simulated MIDI sound through your sound card is now available.  
It is service 31 and is not available in SPIM.  Its implementation is based on the
<tt>javax.sound.midi</tt> package.  It has been tested only under Windows.
See the Syscall tab in MIPS help for further information.  </li>
</ul>

<p>MARS 3.2.1 was released in January 2007.  It is a bug fix release that addresses the
following bug in 3.2: a NullPointerException occurs when MIPS program execution terminates
by "dropping off the bottom" of the program rather than by using one of the Exit system
calls.

<p>MARS 3.2 was released in December 2006.  Major enhancements are:
<ul>
<li>It fixes several minor bugs, including one that
could cause incorrect file sequencing in the Project feature.  
<li>It includes the 
<tt>AbstractMarsToolAndApplication</tt> abstract class to serve as a framework for easily
constructing "tools" and equivalent free-standing applications that use the MARS assembler
and simulator engines (kudos to the SIGCSE 2006 audience member who suggested this capability!).
A subclass of this abstract class can be used both ways (tool or application).  
<li>The floating
point and data cache tools were elaborated in this release and a new tool for animating and
visualizing memory references was developed.  All are <tt>AbstractMarsToolAndApplication</tt>
subclasses.  
<li>This release includes support for exception handlers: the kernel data and text
segments (.kdata and .ktext directives), the MIPS trap-related instructions, and the ability
to automatically include a selected exception (trap) handler with each assemble operation.
<li>Items in the Settings menu became persistent with this release.
<li>Added default assembly file extensions "asm" and "s" to the Config.properties file and used
those not only to filter files for the File Open dialog but also to filter them for the "assemble all"
setting.
<li>Implemented a limit to the amount of text scrollable in the Mars Messages and Run I/O message
tabs - default 1 MB is set in the Config.properties file.
<li>For programmer convenience, labels can now be referenced in the operand field of integer
data directives (.word, .half, .byte).  The assembler will substitute the label's address (low order
half for .half, low order byte for .byte).
<li>For programmer convenience, character literals (e.g. 'b', '\n', '\377') can be used anywhere that integer literals are
permitted.  The assembler converts them directly to their equivalent 8 bit integer value. Unicode is not supported and
octal values must be exactly 3 digits ranging from '\000' to '\377'.
<li>Replaced buttons for selecting Data Segment display base addresses with a combo box and added more
base addresses: MMIO (0xFFFF0000), .kdata (0x90000000), .extern (0x10000000). 
</ul>

<p>MARS 3.1 was released in October 2006.  The major issues and features are listed here:
<ul>
<li>It addressed several minor limits (Tools menu items
could not be run from the JAR file, non-standard shortcuts for Mac users, inflexible and
sometimes inappropriate sizing of
GUI components). 
<li>It changed the way SYSCALLs are implemented, to allow anyone to define
new customized syscall services without modifying MARS.  
<li>It added a primitive
Project capability through the "Assemble operation applies to all files in current directory." 
setting (also available as "p" option in command mode).  The command mode also allows you
to list several file names not necessarily in the same directory to be assembled and linked.
<li>Multi-file assembly also required implementing the ".globl" and ".extern" directives.
<li>And although "Mars tools" are not officially part of MARS releases, MARS 3.1 includes the
initial versions of two tools: one for learning about floating point representation and another
for simulating data caching capability.
</ul>

<p>MARS 3.0 was released in August 2006, with one bug fix and two major additions.  
<ul>
<li>The bug fix was corrected instruction format for the slti and sltiu instructions. 
<li>One major addition is a greatly expanded MIPS-32 instruction
set (trap instructions are the only significant ones to remain unimplemented).  This includes, via
pseudo-instructions, all reasonable memory addressing modes for the load/store instructions.  
<li>The
second major addition is ability to interactively step "backward" through program execution 
one instruction at a time to "undo" execution steps.  It will buffer up to 2000 of the most 
recent execution steps (this limit is stored in a properties file and can be changed).
It will undo changes made to MIPS memory, registers or condition flags,
but not console or file I/O.  This should be a great debugging aid.  
It is available anytime execution is paused and at termination (even if terminated due to 
exception).  
<li>A number of IDE settings, described
above, are now available through the Settings menu.
</ul>

<p>MARS 2.2 was released in March 2006 with additional bug fixes and implemented command
line options (run MARS from command line with h option for command line help).  This also coincides with our 
SIGCSE 2006 paper "MARS: An Education-Oriented MIPS Assembly Language Simulator".

<p>MARS 2.1 was released in October 2005 with some bug fixes.

<p>MARS 2.0 was released in September 2005.  It incorporated significant
modifications to both the GUI and the assembler, floating point registers and instructions
most notably.

<p>MARS 1.0 was released in January 2005 and 
publicized during a poster presentation at SIGCSE 2005.  

<p>Dr. Ken Vollmar initiated MARS development in 2002 at Missouri State University.  In
2003, Dr. Pete Sanderson of Otterbein College and his student Jason Bumgarner continued
implementation.  Sanderson implemented the assembler and simulator that summer, and 
the basic GUI the following summer, 2004.  

<p>The development of Releases 3.1 and 3.2 during fall 2006 was supported by the Otterbein College
sabbatical leave program.  The development of Release 3.7 during summer 2009 was supported by
a SIGCSE Special Projects Grant.

<hr>
<p>
This document is available for printing on the MARS home page
<tt><b>http://www.cs.missouristate.edu/MARS/</b></tt>.
</body>
</html>

